package br.unicarioca.viaexpositus

class UsuarioController extends BaseAutenticacao {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]


    static defaultAction = "list"

    @AnotacaoDeAcao(nomeDaAcao="Listar", padrao="ROLE_ADMINISTRADOR,ROLE_ORGANIZACAO")
    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)

        def usuarioInstanceList

        //Pegando a sessão do usuário
        Usuario usuarioLogado = getUsuario()
        if(usuarioLogado){
            println "1 -------------------------------------------------------- "+usuarioLogado
            println "usuarioLogado.organizacao = "+usuarioLogado.organizacao
            println "2 --------------------------------------------------------"
            if(usuarioLogado.organizacao){
                usuarioInstanceList = Usuario.findAllByOrganizacao(usuarioLogado.organizacao)
            }else{
                usuarioInstanceList = Usuario.list()
            }
            println "3 --------------------------------------------------------"
        }
        
        [usuarioInstanceList: usuarioInstanceList, usuarioInstanceTotal: Usuario.count()]
    }

    @AnotacaoDeAcao(nomeDaAcao="Salvar", padrao="ROLE_ADMINISTRADOR,ROLE_ORGANIZACAO")
    def save = {
        def usuarioInstance = new Usuario(params)
        usuarioInstance.ativo = true
        usuarioInstance.senha = authenticateService.encodePassword(params.senha)
        usuarioInstance.confirmacaoSenha = authenticateService.encodePassword(params.confirmacaoSenha)

        //Pegando a sessão do usuário
        Usuario usuarioLogado = getUsuario()
        if(usuarioLogado){
            usuarioInstance.organizacao = usuarioLogado.organizacao
        }

        usuarioInstance.perfis = []
        def perfil = Perfil.get(params.perfil.id)
        usuarioInstance.perfis << perfil
        perfil.addToUsuarios(usuarioInstance)

        if (usuarioInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])}"
            redirect(action: "list")
        } else {
            render(view: "edit", model: [usuarioInstance: usuarioInstance])
        }
    }

    @AnotacaoDeAcao(nomeDaAcao="Editar", padrao="ROLE_ADMINISTRADOR,ROLE_ORGANIZACAO")
    def edit = {

        if(params.id && params.id != "0"){
            def usuarioInstance = Usuario.get(params.id)
            if (usuarioInstance) {
                return [ usuarioInstance : usuarioInstance]
            }else{
                flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
                redirect(action: "list")
            }
        } else {
            def usuarioInstance = new Usuario()
            return [usuarioInstance: usuarioInstance]
        }
    }

    @AnotacaoDeAcao(nomeDaAcao="Atualizar", padrao="ROLE_ADMINISTRADOR,ROLE_ORGANIZACAO")
    def update = {
        def usuarioInstance = Usuario.get(params.id)
        if (usuarioInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (usuarioInstance.version > version) {
                    
                    usuarioInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'usuario.label', default: 'Usuario')] as Object[], "Another user has updated this Usuario while you were editing")
                    render(view: "edit", model: [usuarioInstance: usuarioInstance])
                    return
                }
            }
            usuarioInstance.properties = params

            def perfil = Perfil.get(params.perfil.id)

            //Limpando usuário do perfil anterior
            usuarioInstance.perfis.each{
                it.removeFromUsuarios(usuarioInstance)
            }

            //Colocando novo perfil
            usuarioInstance.perfis = []
            usuarioInstance.perfis << perfil
            perfil.addToUsuarios(usuarioInstance)

            if(params.senha){
                usuarioInstance.senha = authenticateService.encodePassword(params.senha)
                usuarioInstance.confirmacaoSenha = authenticateService.encodePassword(params.confirmacaoSenha)
            }

            if (!usuarioInstance.hasErrors() && usuarioInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])}"
                redirect(action: "edit", id: usuarioInstance.id)
            }
            else {
                render(view: "edit", model: [usuarioInstance: usuarioInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
            redirect(action: "list")
        }
    }

    @AnotacaoDeAcao(nomeDaAcao="Apagar", padrao="ROLE_ADMINISTRADOR,ROLE_ORGANIZACAO")
    def delete = {
        def usuarioInstance = Usuario.get(params.id)
        if (usuarioInstance) {
            try {
                usuarioInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
                redirect(action: "edit", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
            redirect(action: "list")
        }
    }
}
